﻿using System;
using System.Collections.Generic;

/// <summary>
/// 1. 模式的结构
/// 迭代器模式主要包含以下角色。
/// 抽象聚合（Aggregate）角色：定义存储、添加、删除聚合对象以及创建迭代器对象的接口。
/// 具体聚合（ConcreteAggregate）角色：实现抽象聚合类，返回一个具体迭代器的实例。
/// 抽象迭代器（Iterator）角色：定义访问和遍历聚合元素的接口，通常包含 hasNext()、first()、next() 等方法。
/// 具体迭代器（Concretelterator）角色：实现抽象迭代器接口中所定义的方法，完成对聚合对象的遍历，记录遍历的当前位置。
/// </summary>
namespace Iterator
{
    class Program
    {
        static void Main(string[] args)
        {
            Aggregate ag = new ConcreteAggregate();
            ag.add("中山大学");
            ag.add("华南理工");
            ag.add("韶关学院");
            Console.WriteLine("聚合的内容有：");
            Iterator it = ag.getIterator();
            while (it.hasNext())
            {
                Object obj = it.next();
                Console.WriteLine(obj.ToString() + "\t");
            }
            Object ob = it.first();
            Console.WriteLine("\nFirst：" + ob.ToString());
        }
    }
    //抽象聚合
    interface Aggregate
    {
        public void add(Object obj);
        public void remove(Object obj);
        public Iterator getIterator();
    }
    //具体聚合
    class ConcreteAggregate : Aggregate
    {
        private List<Object> list = new List<Object>();
        public void add(Object obj)
        {
            list.Add(obj);
        }
        public void remove(Object obj)
        {
            list.Remove(obj);
        }
        public Iterator getIterator()
        {
            return (new ConcreteIterator(list));
        }
    }
    //抽象迭代器
    interface Iterator
    {
        Object first();
        Object next();
        bool hasNext();
    }
    //具体迭代器
    class ConcreteIterator : Iterator
    {
        private List<Object> list = null;
        private int index = -1;
        public ConcreteIterator(List<Object> list)
        {
            this.list = list;
        }
        public bool hasNext()
        {
            if (index < list.Count - 1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        public Object first()
        {
            index = 0;
            Object obj = list[index]; ;
            return obj;
        }
        public Object next()
        {
            Object obj = null;
            if (this.hasNext())
            {
                obj = list[++index];
            }
            return obj;
        }
    }
}
